home *** CD-ROM | disk | FTP | other *** search
/ Aminet 25 / Aminet 25 (1998)(GTI - Schatztruhe)[!][Jun 1998].iso / Aminet / misc / emu / AppEmu.lha / BImage.p < prev    next >
Encoding:
Text File  |  1998-03-08  |  4.6 KB  |  261 lines

  1. program BImage;
  2. {  Copy disk in drive 1 to file in RAMDisk  }
  3. {  June 2, 1994  }
  4.  
  5. type mem = array[0..16383] of char;
  6.  
  7. var match: boolean;
  8.     high, low, ch: char;
  9.     first, second, size, i, j: integer;
  10.     image: file of char;
  11.     buff: mem;
  12.  
  13. procedure GetTrack(t: integer; var b: mem);
  14.   begin
  15. #A
  16. ;
  17. ;
  18. ;
  19. PTR     EQU     _T+2
  20. LEN     EQU     _T+4
  21. ;
  22. ;       ROM routine
  23. ;
  24. DELAY   EQU     $FCA8
  25. ;
  26. ;       Disk I/O selects
  27. ;
  28. DRVSM0  EQU     $C080
  29. DRVSM1  EQU     $C081
  30. DRVSM2  EQU     $C082
  31. DRVSM4  EQU     $C084
  32. DRVSM6  EQU     $C086
  33. DRVOFF  EQU     $C088
  34. DRVON   EQU     $C089
  35. DRVSL1  EQU     $C08A
  36. DRVRD   EQU     $C08C
  37. DRVRDM  EQU     $C08E
  38. ;
  39. ;       Get pointer to buffer
  40. ;
  41.         LDY     #5
  42.         LDA     (_SP),Y
  43.         STA     PTR
  44.         INY
  45.         LDA     (_SP),Y
  46.         STA     PTR+1
  47. ;
  48. ;       Get track number
  49. ;
  50.         INY
  51.         LDA     (_SP),Y
  52.         STA     TRACK
  53. ;
  54. ;
  55. ;
  56.         JMP     START
  57. ;
  58. ;       Work areas
  59. ;
  60. TRACK   DB      $00
  61. UNITNUM DB      $60
  62. SLOT    DB      $60
  63. DESTRK  DB      $00
  64. CURTRK  DB      $00
  65. DELTA   DB      $00
  66. FLAG    DB      $00
  67. ;
  68. ;
  69. ;
  70. RECALC  LDA     #$30
  71.         STA     CURTRK
  72.         LDA     #$00
  73.         STA     DESTRK
  74.         JSR     ARMOVE
  75.         LDX     SLOT
  76.         LDA     DRVSM0,X
  77.         LDA     DRVSM2,X
  78.         LDA     DRVSM4,X
  79.         LDA     DRVSM6,X
  80.         RTS
  81. ;
  82. ;
  83. ;
  84. ARMOVE  LDA     #$00
  85.         STA     FLAG
  86.         LDA     CURTRK
  87.         CLB
  88.         SBB     DESTRK
  89.         BE      DONE
  90.         BNB     OK
  91.         EOR     #$FF
  92.         ADC     #1
  93. OK      STA     DELTA
  94.         ROL     FLAG
  95.         LSR     CURTRK
  96.         ROL     FLAG
  97.         ASL     FLAG
  98.         LDY     FLAG
  99. LOOP    LDA     TABLE,Y
  100.         JSR     PHASE
  101.         LDA     TABLE+1,Y
  102.         JSR     PHASE
  103.         TYA
  104.         EOR     #$02
  105.         TAY
  106.         DEC     DELTA
  107.         LDA     DELTA
  108.         BNE     LOOP
  109.         LDA     DESTRK
  110.         STA     CURTRK
  111. DONE    RTS
  112. ;
  113. ;
  114. ;
  115. PHASE   ORA     SLOT
  116.         TAX
  117.         LDA     DRVSM1,X
  118.         JSR     WAIT
  119.         LDA     DRVSM0,X
  120.         RTS
  121. ;
  122. ;
  123. ;
  124. WAIT    LDA     #$56
  125.         JSR     DELAY
  126.         RTS
  127. ;
  128. ;
  129. ;
  130. TABLE   DB      $02,$04,$06,$00
  131.         DB      $06,$04,$02,$00
  132. ;
  133. ;
  134. ;
  135. START   LDA     UNITNUM
  136.         PHA
  137.         AND     #$70
  138.         STA     SLOT
  139.         TAX
  140.         PLA
  141.         BNM     DRIVE1
  142.         INX
  143. DRIVE1  LDA     DRVSL1,X
  144.         LDX     SLOT
  145.         LDA     DRVON,X
  146.         LDA     DRVRDM,X
  147.         JSR     RECALC
  148.         LDA     TRACK
  149.         STA     DESTRK
  150.         JSR     ARMOVE
  151. ;
  152. ;       Set page count
  153. ;
  154.         LDA     #64
  155.         STA     LEN
  156. ;
  157. ;
  158. ;
  159.         LDY     #0
  160. ;
  161. ;
  162. ;
  163.         LDX     SLOT
  164. LOOP1   LDA     DRVRD,X
  165.         BNM     LOOP1
  166.         CMP     #$FF
  167.         BNE     LOOP1
  168. LOOP2   LDA     DRVRD,X
  169.         BNM     LOOP2
  170.         CMP     #$FF
  171.         BNE     LOOP1
  172. LOOP3   LDA     DRVRD,X
  173.         BNM     LOOP3
  174.         CMP     #$FF
  175.         BE      LOOP3
  176.         BNE     LOOP4
  177. ;
  178. ;
  179. ;
  180. LOOPD   LDA     DRVRD,X
  181.         BNM     LOOPD
  182. ;
  183. ;
  184. ;
  185. LOOP4   STA     (PTR),Y
  186. ;
  187. ;       Increment low byte of pointer
  188. ;
  189.         INC     PTR
  190.         BNE     LOOPD
  191.         INC     PTR+1
  192. ;
  193. ;       Decrement page count
  194. ;
  195.         DEC     LEN
  196.         BNZ     LOOPD
  197. ;
  198. ;       Turn motor off
  199. ;
  200.         LDX     SLOT
  201.         LDA     DRVOFF,X
  202. #
  203.   end;
  204.  
  205. function FindAddrField(p: integer): integer;
  206.   var found: boolean;
  207.       i: integer;
  208.   begin
  209.     i := p;
  210.     found := false;
  211.     repeat
  212.       if ord(buff[i]) = 213 {$D5}
  213.           then if ord(buff[i + 1]) = 170 {$AA}
  214.                    then if ord(buff[i + 2]) = 150 {$96}
  215.                             then if ord(buff[i + 11]) = 222 {$DE}
  216.                                      then if ord(buff[i + 12]) = 170 {$AA}
  217.                                               then found := true;
  218.       if not found
  219.           then i := i + 1
  220.     until found;
  221.     FindAddrField := i
  222.   end;
  223.  
  224. begin
  225.   writeln('Source disk in drive 1');
  226.   writeln('Output file will be on "/R"');
  227.   writeln('Ready? ');
  228.   readln(ch);
  229.   rewrite(image, '/R/BITIMAGE');
  230.   for i := 0 to 34
  231.     do begin
  232. writeln('Begin reading track ',i);
  233.       GetTrack(i, buff);
  234. {
  235. writeln('Done');
  236. }
  237.       first := FindAddrField(2);
  238.       second := FindAddrField(first + 5502);
  239.       repeat
  240.         match := true;
  241.         j := 2;
  242.         repeat
  243.           j := j + 1;
  244.           match := buff[first + j] = buff[second + j]
  245.         until not match or (j = 10);
  246.         if not match
  247.             then second := FindAddrField(second + 1)
  248.       until match;
  249.       size := second - first;
  250.       writeln(size);
  251.       high := chr(size div 256);
  252.       low := chr(size mod 256);
  253.       buff[first - 2] := low;
  254.       buff[first - 1] := high;
  255.       buff[second] := low;
  256.       buff[second + 1] := high;
  257.       for j := first - 2 to second + 1
  258.         do write(image, buff[j])
  259.     end
  260. end.
  261.